package com.example.web.websocket;

import com.example.web.websocket.entity.User;
import com.example.web.websocket.handle.MessageHandle;
import com.example.web.websocket.handle.UserHandle;
import lombok.extern.slf4j.Slf4j;

import javax.websocket.*;
import javax.websocket.server.PathParam;

/**
 * webSocket服务端
 */
@Slf4j
//@Component
//@ServerEndpoint(value = "/websocket/{group}/{key}")
public class WebSocketServer {
    private UserHandle userHandle = UserHandle.getHandle();
    private MessageHandle messageHandle = MessageHandle.getHandle();

    /**
     * 连接建立后触发的方法
     *
     * @param session
     * @param group
     * @param key
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "key") String key, @PathParam(value = "group") String group) {
        //添加当前登录user
        User user = new User(session, group, key);
        userHandle.addUser(user);
        //检查当前登录用户是否存在未接受的消息
        messageHandle.checkMessageQueue(user);

        log.info("onOpen新连接加入：" + group + "/" + key);
        log.info("当前在线人数 ：" + userHandle.sum());
    }

    /**
     * 连接关闭后触发的方法
     */
    @OnClose
    public void onClose(@PathParam(value = "key") String key) {
        userHandle.removeUser(key);
        log.info("onClose离线：key=" + key);
        log.info("当前在线人数 ：" + userHandle.sum());
    }

    /**
     * 接收到客户端消息时触发的方法
     */
    @OnMessage
    public void onMessage(String messageJson, @PathParam(value = "key") String key) {
        log.info("OnMessage收到 key=" + key + " 的信息：>>> " + messageJson);
        messageHandle.parseMessage(messageJson);
    }

    /**
     * 发生错误时触发的方法
     */
    @OnError
    public void onError(Throwable error) {
        log.info("OnError：连接发生错误" + error.getMessage(), error);
    }


}
